#include "minimp3_decoder.h"

namespace OHOS {
namespace Media {
namespace Plugin {


Status Minimp3Decoder::Init()
{
    // 做初始化的工作
    // 初始化那些播放任意音频流都需要用的资源
}

Status Minimp3Decoder::Prepare()
{
    // 启动播放某一条音频流之前会调用
    // 做播放前的准备工作
    // 比如设置一些参数
    // 这些参数可能是播放该流之前，框架设置下来的。
}

Status Minimp3Decoder::Start()
{
    // 启动播放
    // 调用minimp3的接口，使得它启动解码工作
}

Status Minimp3Decoder::Stop()
{
    // 停止播放
    // 调用minimp3的停止解码接口
}

Status Minimp3Decoder::QueueInputBuffer(const std::shard_ptr<Buffer> &inputBuffers, int32_t timeoutMs)
{
    // 前一个节点把要解码的EsData通过inputBuffers传进来。
    // 需要调用 minimp3 的输入数据接口，把EsData传给它。
    minimp3_decode_input_buffer(inputBuffers.GetReadOnlyData(), inputBuffers.GetSize(), out_buff);

    std::shared_ptr<Buffer> ioInfo = outBufferQ_.Pop();
    ioInfo->Write(out_buff, size);
    
    // 数据产生时，调用执行下面这句话，把输出数据传给框架(Filte)
    CALL_WEAK_PTR_FUNC(dataCb_, OnOutputBufferDone, ioInfo); // buffer中已填充数据

    // 当某个地方inputBuffers中的数据已经用完，不再需要该buffer，则调用下面方法通知框架(Filter)
    // 不一定是在当前函数中
    CALL_WEAK_PTR_FUNC(dataCb_, OnInputBufferDone, buffer); // buffer是要释放的
}
Status Minimp3Decoder::QueueOutputBuffer(const std::shard_ptr<Buffer> &outputBuffers, int32_t timeoutMs)
{
    // filter把接收结果数据的Buffer通过outputBuffers传进来。
    // 需要让minimp3把输出数据写入这些Buffer。
}
Status Minimp3Decoder::Flush()
{
    // 调用 minimp3 的 flush 接口清除数据。
}
Status Minimp3Decoder::SetDataCallback(const std::weak_ptr<DataCallback &dataCallback>)
{
    dataCb_ = dataCallback;
    return Status::OK;
}


}
}
}